# -*- coding: utf-8 -*-
"""
文件解析工具模块
统一处理文件列表解析逻辑，避免重复代码
"""

from datetime import datetime
from gglobal import logger
from ..models.filetree_model import FileInfo


class FileParser:
    """统一的文件解析工具类"""
    
    @staticmethod
    def parse_ls_output(output, base_path=""):
        """解析 ls -la 命令输出，转换为FileInfo格式
        
        参数:
            output: ls -la命令的输出字符串
            base_path: 基础路径（可选）
            
        返回:
            list: FileInfo对象列表
        """
        files = []
        
        # 如果是字符串列表，处理每一行
        if isinstance(output, list):
            for line in output:
                if isinstance(line, str) and line.strip():
                    file_info = FileParser._parse_ls_line(line)
                    if file_info:
                        files.append(file_info)
        # 如果是单个字符串，按行分割
        elif isinstance(output, str):
            lines = output.strip().split('\n')
            for line in lines:
                line = line.strip()
                if line and not line.startswith('total') and not line.startswith('ls:'):
                    file_info = FileParser._parse_ls_line(line)
                    if file_info:
                        files.append(file_info)
        
        logger.info(f"解析文件列表完成，共 {len(files)} 个文件")
        return files
    
    @staticmethod
    def _parse_ls_line(line):
        """解析ls -la输出的单行数据
        
        参数:
            line: ls -la输出的一行
            
        返回:
            FileInfo: 文件信息对象，解析失败返回None
        """
        try:
            parts = line.split()
            if len(parts) < 9:
                return None
                
            permissions = parts[0]
            # parts[1] 是链接数
            owner = parts[2] if len(parts) > 2 else "unknown"
            group = parts[3] if len(parts) > 3 else "unknown"
            size_str = parts[4] if len(parts) > 4 and parts[4].isdigit() else '0'
            
            # 处理日期时间信息 (parts[5], parts[6], parts[7])
            try:
                # ls -la 格式: 月份 日期 时间/年份
                month = parts[5] if len(parts) > 5 else "Jan"
                day = parts[6] if len(parts) > 6 else "1"
                time_or_year = parts[7] if len(parts) > 7 else "00:00"
                
                # 简化处理：如果包含冒号则是时间，否则是年份
                if ":" in time_or_year:
                    # 当前年份的文件
                    current_year = datetime.now().year
                    time_str = f"{current_year} {month} {day} {time_or_year}"
                    modified_time = datetime.strptime(time_str, "%Y %b %d %H:%M")
                else:
                    # 其他年份的文件
                    time_str = f"{time_or_year} {month} {day}"
                    modified_time = datetime.strptime(time_str, "%Y %b %d")
            except (ValueError, IndexError):
                # 解析失败时使用当前时间
                modified_time = datetime.now()
            
            # 处理文件名（可能包含空格）
            name_parts = parts[8:]
            name = ' '.join(name_parts)
            
            # 跳过当前目录和上级目录
            if name in [".", ".."]:
                return None
            
            # 判断是否为目录
            is_directory = permissions.startswith('d')
            
            # 构建FileInfo对象
            size = int(size_str) if size_str.isdigit() else 0
            
            # 组合所有者信息
            owner_info = f"{owner}:{group}"
            
            file_info = FileInfo(
                name=name,
                size=size,
                is_directory=is_directory,
                modified_time=modified_time,
                permissions=permissions,
                owner=owner_info
            )
            
            # 添加调试日志
            # logger.debug(f"解析文件: {name}, 所有者: {owner_info}, 权限: {permissions}, 大小: {size}")
            
            return file_info
            
        except Exception as e:
            logger.warning(f"解析文件行失败: {line}, 错误: {e}")
            return None
    
    @staticmethod
    def validate_file_info(file_info):
        """验证文件信息对象的有效性
        
        参数:
            file_info: FileInfo对象
            
        返回:
            bool: 是否有效
        """
        if not file_info or not hasattr(file_info, 'name'):
            return False
            
        if not file_info.name or file_info.name.strip() == "":
            return False
            
        return True
    
    @staticmethod
    def filter_valid_files(files):
        """过滤有效的文件信息
        
        参数:
            files: FileInfo对象列表
            
        返回:
            list: 过滤后的有效FileInfo对象列表
        """
        return [f for f in files if FileParser.validate_file_info(f)]